#pragma once

#include <vex/core/contract/handle.h>
#include <vex/iterable/contract/range.h>
#include <cstddef>
#include <cstdint>

namespace tests_exe {
    namespace vc = vex::core;
    namespace vi = vex::iterable;

    struct  VEX_ABSTRACT Iperf_test_runner 
        : virtual public vc::contract::handle
    {
        virtual void run() = 0;
        virtual const char* name() const = 0;
        virtual std::int64_t duration_in_ticks() const = 0;
        VEX_PROTECT_CONTRACT(Iperf_test_runner);
    };

    typedef vi::contract::range<vi::output, Iperf_test_runner*> Iperf_test_runner_collector;
}